Webframeworkk/ASP.NET Core/Controllers und IActionResult
In der **Model-View-Controller (MVC)** Architektur fungieren Controller als Orchestratoren der Webanwendung. Sie verarbeiten eingehende HTTP-Anfragen, interagieren mit dem Model (Datenbank oder Business-Logik) und wählen die passende View für die Antwort aus.
- **Controller**: Klassen, die verwandte Action Methods gruppieren. Sie befinden sich typischerweise im Ordner `Controllers`.
- **Action Methods**: Öffentliche Methoden innerhalb eines Controllers, die spezifische Anfragen bearbeiten (z.B. Anzeigen einer Seite, Verarbeiten von Formulardaten).
Zweck
- **Logik organisieren**: Controller bieten eine logische Gruppierung für Aktionen, die auf demselben Datentyp oder derselben Funktionalität arbeiten.
- **Anfragen behandeln**: Sie sind verantwortlich für das Verarbeiten von Requests, das Abrufen notwendiger Daten und das Vorbereiten einer Antwort.
- **Views auswählen**: Controller wählen oft die geeignete View zum Rendern aus und übergeben Daten (das Model) an die View.
Syntax und Konventionen
- **Klassenbenennung**: Controller-Klassennamen sollten auf "Controller" enden (z.B. `HomeController`, `ProductsController`).
- **Vererbung**: Controller erben von der Basisklasse `Controller` (oder `ControllerBase` für API-Controller).
- **Action Method Benennung**: Methoden können jeden gültigen C#-Namen haben.
- **Routing**: Routen können über Attribute wie `[Route]`, `[HttpGet]`, `[HttpPost]` definiert werden.
Code-Beispiel
// HomeController.cs
namespace ControllersExample.Controllers
{
[Controller] // Markiert die Klasse als Controller
public class HomeController : Controller
{
[Route("home")] // Route für diese Action
public string Index()
{
return "Hello from Index";
}
[Route("contact-us/{mobile:regex(^\\d{10}$)}")] // Route mit Constraint
public string Contact()
{
return "Hello from Contact";
}
}
}
Einrichtung in Program.cs
Um Controller zu verwenden, müssen sie registriert und dem Routing-System hinzugefügt werden:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); // Aktiviert MVC Controller
var app = builder.Build();
app.UseRouting();
app.MapControllers(); // Verbindet Controller mit dem Routing-System
app.Run();
IActionResult
Das `IActionResult` Interface ist ein Kernkonzept in ASP.NET Core MVC. Es dient als Rückgabetyp für Action Methods und ermöglicht es, je nach Kontext der Anfrage unterschiedliche Arten von Antworten zurückzugeben.
Es definiert einen Vertrag mit einer einzigen Methode:
Task ExecuteResultAsync(ActionContext context);
Rückgabetypen (Action Results)
Hier sind die wichtigsten von `IActionResult` abgeleiteten Ergebnistypen:
ContentResult
Gibt rohen Inhalt (Text, HTML, JSON, etc.) zurück, ohne eine View zu rendern.
- **Einsatz**: Einfache Textnachrichten, API-Antworten oder benutzerdefinierte Formate.
- **Eigenschaften**: `Content` (Inhalt), `ContentType` (MIME-Type, z.B. `text/html`).
// Verwendung der Helper-Methode
public ContentResult Index()
{
return Content("<h1>Welcome</h1>", "text/html");
}
JsonResult
Serialisiert ein Objekt in JSON-Format und gibt es zurück.
- **Einsatz**: RESTful APIs, AJAX-Antworten.
- **ContentType**: Setzt automatisch `application/json`.
public JsonResult Person()
{
var person = new { FirstName = "James", LastName = "Smith", Age = 25 };
return Json(person); // Helper-Methode
}
FileResult
Dient zum Senden von Dateien (PDF, Bilder, Dokumente) an den Client.
VirtualFileResult
Dient Dateien aus dem Web-Root (`wwwroot`) oder einem virtuellen Pfad.
return File("/sample.pdf", "application/pdf");
PhysicalFileResult
Dient Dateien von einem absoluten physischen Pfad auf dem Server. **Vorsicht**: Sicherheit beachten!
return PhysicalFile(@"c:\aspnetcore\sample.pdf", "application/pdf");
FileContentResult
Dient Dateien aus einem Byte-Array im Speicher.
byte[] bytes = System.IO.File.ReadAllBytes(@"c:\sample.pdf");
return File(bytes, "application/pdf");
Status Code Results
Ermöglicht das Senden standardisierter HTTP-Statuscodes, um den Client über das Ergebnis der Anfrage zu informieren.
- **OkResult (200)**: Erfolgreiche Anfrage.
- **BadRequestResult (400)**: Client-Fehler, z.B. ungültige Eingabe.
- **NotFoundResult (404)**: Ressource nicht gefunden.
- **UnauthorizedResult (401)**: Authentifizierung erforderlich.
- **StatusCodeResult**: Jeder beliebige Statuscode.
public IActionResult GetBook(int id)
{
if (id <= 0)
{
return BadRequest("Invalid ID"); // 400
}
if (id > 1000)
{
return NotFound("Book not found"); // 404
}
return Ok(); // 200
}
Redirect Results
Leitet den Browser zu einer anderen URL um.
RedirectResult
Leitet zu einer URL weiter (absolut oder relativ).
return Redirect("/home");
RedirectToActionResult
Leitet zu einer spezifischen Action in einem Controller weiter.
return RedirectToAction("Index", "Home");
LocalRedirectResult
Leitet zu einer lokalen URL innerhalb der Anwendung weiter (Schutz vor Open Redirects).
return LocalRedirect("/products/details/1");
Statuscodes für Redirects
- **302 Found (Temporär)**: Standard. Ressource ist vorübergehend unter neuer URL.
- **301 Moved Permanently**: Ressource wurde dauerhaft verschoben.
* Verwendung: `RedirectPermanent`, `RedirectToActionPermanent`, `LocalRedirectPermanent`.